//[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
/**
 *
 *@file		fog_sys.c
 *@brief	フォグシステム
 *@author	tomoya takahashi
 *@data		2005.04.27
 *
 */
//]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]

#define __FOG_SYS_H_GLOBAL
#include "common.h"
#include "fog_sys.h"

//-----------------------------------------------------------------------------
/**
 *					定数宣言
 */
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
/**
 *					構造体宣言
 */
//-----------------------------------------------------------------------------
//-------------------------------------
//	フォグデータ構造体
//=====================================
typedef struct _FOG_DATA{
	BOOL	flag;		// on/offフラグ----(TRUE / FALSE)
	s32		fog_mode;	// フォグモード----カラーとアルファにかける/アルファのみかける(0 / 1)
	s32		fog_slope;	// かかりぐあい----(0〜10)	0<10で濃いです
	int		offset;		// どのデプス値からかけるか

	GXRgb	color;		// フォグカラー
	int alpha;			// α(0〜31)	BGへの透過度

	char	fog_tbl_data[32];		// ３２段階のフォグテーブル	(濃度は0〜127)
}FOG_DATA;


//----------------------------------------------------------------------------
/**
 *					プロトタイプ宣言
 */
//-----------------------------------------------------------------------------

//----------------------------------------------------------------------------
/**
 *					グローバル変数宣言
 */
//-----------------------------------------------------------------------------
//-------------------------------------
//	フォグデータ保存領域を作成
//-------------------------------------
//----------------------------------------------------------------------------
/**
 *
 *@brief	フォグデータ保存領域を作成
 *
 *@param	none
 *
 *@return	FOG_DATA_PTR	作成されたフォグデータ保存領域
 *
 *
 */
//-----------------------------------------------------------------------------
FOG_DATA_PTR FogSys_Init(void)
{
	FOG_DATA_PTR fog_data;
	fog_data = sys_AllocMemory(HEAPID_FIELD, sizeof(FOG_DATA));
	MI_CpuClear32(fog_data, sizeof(FOG_DATA));

	return fog_data;
}

//----------------------------------------------------------------------------
/**
 *
 *@brief	フォグデータ保存領域を破棄
 *
 *@param	pFogData	フォグデータ保存領域のポインタを指すアドレス
 *
 *@return	none
 *
 *
 */
//-----------------------------------------------------------------------------
void FogSys_Delete(FOG_DATA_PTR* pFogData)
{
	sys_FreeMemory(HEAPID_FIELD, *pFogData);
	*pFogData = NULL;
}

//-------------------------------------
//	今のフォグの状態を取得
//-------------------------------------
//----------------------------------------------------------------------------
/**
 *
 *@brief	ON/OFFフラグを取得
 *
 *@param	FogData		フォグデータ保存領域
 *
 *@return	BOOL	ON:TRUE		OFF:FALSE
 *
 *
 */
//-----------------------------------------------------------------------------
BOOL GetFogFlag(FOG_DATA_PTR FogData)
{
	return FogData->flag;
}

//----------------------------------------------------------------------------
/**
 *
 *@brief	フォグモードを取得
 *
 *@param	FogData		フォグデータ保存領域
 *
 *@return	int			フォグモード
 *
 *
 */
//-----------------------------------------------------------------------------
int GetFogMode(FOG_DATA_PTR FogData)
{
	return FogData->fog_mode;
}

//----------------------------------------------------------------------------
/**
 *
 *@brief	フォグのかかり具合を取得
 *
 *@param	FogData		フォグデータ保存領域
 *
 *@return	int			フォグのかかり具合値
 *
 *
 */
//-----------------------------------------------------------------------------
int GetFogSlope(FOG_DATA_PTR FogData)
{
	return FogData->fog_slope;
}

//----------------------------------------------------------------------------
/**
 *
 *@brief	フォグのかかり始めるデプス値取得
 *
 *@param	FogData		フォグデータ保存領域
 *
 *@return	int			フォグのかかり始めるデプス値
 *
 *
 */
//-----------------------------------------------------------------------------
int GetFogOffset(FOG_DATA_PTR FogData)
{
	return FogData->offset;
}

//----------------------------------------------------------------------------
/**
 *
 *@brief	フォグカラー取得
 *
 *@param	FogData		フォグデータ保存領域
 *
 *@return	GXRgb		フォグカラー
 *
 *
 */
//-----------------------------------------------------------------------------
GXRgb GetFogColor(FOG_DATA_PTR FogData)
{
	return FogData->color;
}

//----------------------------------------------------------------------------
/**
 *
 *@brief	フォグのα値を取得
 *
 *@param	FogData		フォグデータ保存先
 *
 *@return	int			α値
 *
 *
 */
//-----------------------------------------------------------------------------
int GetFogAlpha(FOG_DATA_PTR FogData)
{
	return FogData->alpha;
}
//----------------------------------------------------------------------------
/**
 *
 *@brief	フォグテーブル取得
 *
 *@param	FogData		フォグデータ保存領域
 *
 *@return	const char*	フォグテーブルポインタ	(要素数は32です)
 *
 *
 */
//-----------------------------------------------------------------------------
const char* GetFogTbl(FOG_DATA_PTR FogData)
{
	return FogData->fog_tbl_data;
}

//-------------------------------------
//	フォグデータを設定
//-------------------------------------
//----------------------------------------------------------------------------
/**
 *
 *@brief	フォグデータを保存領域に設定し、描画に反映させる
 *
 *@param	FogData		フォグデータ保存領域
 *@param	cont		制御フラグ			値を変更したいデータ種類の定数を｜で指定するFOG_SYS_ALLは全て設定
 *@param	flag		フォグフラグ
 *@param	fogMode		フォグモード
 *@param	fogSlope	フォグのかかり具合
 *@param	offset		フォグのかかり始めるデプス値
 *
 *@return	none
 *
 *
 */
//-----------------------------------------------------------------------------
void SetFogData(FOG_DATA_PTR FogData, int cont, BOOL flag, int fogMode, int fogSlope, int offset)
{
	if(cont & FOG_SYS_FLAG){
		FogData->flag		= flag;
	}
	if(cont & FOG_SYS_MODE){
		FogData->fog_mode	= fogMode;
	}
	if(cont & FOG_SYS_SLOPE){
		FogData->fog_slope	= fogSlope;
	}
	if(cont & FOG_SYS_OFFSET){
		FogData->offset		= offset;
	}

	G3X_SetFog(FogData->flag,
			FogData->fog_mode,
			FogData->fog_slope,
			FogData->offset);
}
//----------------------------------------------------------------------------
/**
 *
 *@brief	フォグカラーを保存領域に設定し、描画に反映
 *
 *@param	FogData		フォグデータ保存領域
 *@param	cont		制御フラグ			値を変更したいデータ種類の定数を｜で指定するFOG_SYS_ALLは全て設定
 *@param	color		カラー
 *@param	alpha		α値
 *
 *@return	none
 *
 *
 */
//-----------------------------------------------------------------------------
void SetFogColor(FOG_DATA_PTR FogData,int cont,  GXRgb color, int alpha)
{
	if(cont & FOG_SYS_RGB){
		FogData->color = color;
	}
	if(cont & FOG_SYS_ALPHA){
		FogData->alpha = alpha;
	}

	G3X_SetFogColor(FogData->color, FogData->alpha);
}
//----------------------------------------------------------------------------
/**
 *
 *@brief	フォグテーブルを保存領域に設定し、描画に反映
 *
 *@param	FogData			フォグデータ保存領域
 *@param	char* fog_tbl	フォグテーブル
 *
 *@return	none
 *
 *
 */
//-----------------------------------------------------------------------------
void SetFogTbl(FOG_DATA_PTR FogData, const char* fog_tbl)
{
	MI_CpuCopy32(fog_tbl, FogData->fog_tbl_data, 32);

	G3X_SetFogTable((u32*)FogData->fog_tbl_data);
}